﻿/**
 * layer弹窗图标样式
 */
var layerStateIcon = {
    success: { icon: 1 },
    failed: { icon: 2 },
    confirm: { icon: 3 },
    warning: { icon: 7 },
}

//常量
var constVar = {
    userName: "userName",  //登录账号
    account: "account",  //登录账号名
    usertoken: "usertoken", //usertoken名称
    logintime: "logintime",//登录时间
    alarmids: "alarmids"//告警消息主键
}

/**
 * 显示Loading
 * @param showShade 是否显示遮罩层
 * @author lcw
*/
function ShowLoading(showShade) {
    if ($("body").find(".pageloading").length <= 0) {
        $("body").append("<div class=\"pageloading\"></div>");
    }
    if ($("body").find(".pageloading_bg").length <= 0) {
        $("body").append("<div class=\"pageloading_bg\"></div>");
    }
    $(".pageloading").show();
    if (showShade) {
        //$(".pageloading_bg").height($("body")[0].scrollHeight)
        $(".pageloading_bg").show();
    }
}

/**
 * 关闭Loading
 */
function HideLoading() {
    $(".pageloading,.pageloading_bg").hide();
}

/**
 * 显示Loading（全屏）
 * @param showShade 是否显示遮罩层
 * @author lcw
*/
function ShowLoadingOverall(showShade) {
    if (top.$("body").find(".pageloading").length <= 0) {
        top.$("body").append("<div class=\"pageloading_bg\"></div><div class=\"pageloading\"></div>");
    }
    top.$(".pageloading").show();
    if (showShade) {
        top.$(".pageloading_bg").show();
    }

}

/**
 * 关闭Loading-全屏
 */
function HideLoadingOverall() {
    top.$(".pageloading,.pageloading_bg").hide();
}

/**
 * 刷新当前页面
 */
function RefreshThisPage() {
    this.window.location.href = this.window.location.href;
}


/**
 * Layer弹窗页面关闭自己
 */
function LayerClose() {
    var index = top.layer.getFrameIndex(window.name); //获取窗口索引
    top.layer.close(index);
}

$(function () {
    $("body").click(function () {
        if (self != top) {
            try {
                top.bodyClick();
            } catch (e) {

            }
        }
    })
})


//============================表单插件方法—Start======================================
/**
 * RadioList初始化
 * @param options 默认参数
 * 使用示例：
 * $("#radioList1_box").RadioListInit({
        id: "moduleId",  text: "moduleName", name: "radioList1", 
        url: WebConfig.SYSTEM_API_URL + '/api/module/getAll',  
        param: [], inline: true,changed: "7"
   });
 */
$.fn.RadioListInit = function (options) {
    var defaults = {
        id: "id", //value字段名
        text: "text", //text字段名
        name: "",  //表单name属性（实际使用中建议不要为空）
        url: "",  //数据接口地址
        params: [],  //数据接口参数
        data: null,
        inline: true,  //是否为单行模式
        changed: null  //初始选中项
    };
    var options = $.extend(defaults, options);
    var $element = $(this);
    if (options.data) {
        BindList(options.data, options);
    }
    else if (options.url) {
        GetAjax(options.url, options.params, function (res) {
            var data = res.Data;
            BindList(data, options);
        });
    }
    /**
     * 绑定选项列表
     */
    function BindList(data, options) {
        var itemsHtml = '';
        $.each(data, function (i) {
            itemsHtml += '<div class="radio radio-primary {0}">'.format((options.inline ? 'radio-inline' : ''))
            itemsHtml += '<input type="radio" name="{0}" id="{0}-{1}" value="{2}">'.format(options.name, i, data[i][options.id]);
            itemsHtml += '<label for="{0}-{1}">{2}</label >'.format(options.name, i, data[i][options.text]);
            itemsHtml += '</div>'
        });
        $element.append(itemsHtml);
        //设置默认选中项
        if (options.changed) {
            $element.find("input").SetRadioVal(options.changed);
        }
    }
}


/**
 * CheckboxList初始化
 * @param options 默认参数
 * 使用示例：
 * $("#selectSingle").SelectInit({
        id: "moduleId", text: "moduleName", 
        //url: WebConfig.SYSTEM_API_URL + '/api/module/getAll',  
        data: [{ moduleId: "7", moduleName: "css" }, { moduleId: "2", moduleName: "html" }, { moduleId: "3", moduleName: "javascript" }],
        param: [], changed: "7"  
    });
 */
$.fn.CheckboxListInit = function (options) {
    var defaults = {
        id: "id", //value字段名
        text: "text", //text字段名
        name: "",  //表单name属性（实际使用中建议不要为空）
        url: "",  //数据接口地址
        params: [],  //数据接口参数
        data: null,
        inline: true,  //是否为单行模式
        changed: null  //初始选中项
    };
    var options = $.extend(defaults, options);
    var $element = $(this);
    if (options.data) {
        BindList(options.data, options);
    }
    else if (options.url) {
        GetAjax(options.url, options.params, function (res) {
            var data = res.Data;
            BindList(data, options);
        });
    }
    /**
     * 绑定选项列表
     */
    function BindList(data, options) {
        var itemsHtml = '';
        $.each(data, function (i) {
            itemsHtml += '<div class="checkbox checkbox-primary {0}">'.format((options.inline ? 'radio-inline' : ''))
            itemsHtml += '<input type="checkbox" name="{0}" id="{0}-{1}" value="{2}">'.format(options.name, i, data[i][options.id]);
            itemsHtml += '<label for="{0}-{1}">{2}</label >'.format(options.name, i, data[i][options.text]);
            itemsHtml += '</div>'
        });
        $element.html(itemsHtml);
        //设置默认选中项
        if (options.changed) {
            $element.find("input").SetCheckboxVal(options.changed);
        }
    }
}


/**
 * Select初始化
 * @param options 默认参数
 * 使用示例：
 * $("#selectMulti").SelectInit({
        id: "moduleId", text: "moduleName",  
        //url: WebConfig.SYSTEM_API_URL + '/api/module/getAll', 
        data: [{ moduleId: "7", moduleName: "css" }, { moduleId: "2", moduleName: "html" }, { moduleId: "3", moduleName: "javascript" }],
        param: [], changed: ["7", "2"] 
    });
 */
$.fn.SelectInit = function (options) {
    var defaults = {
        id: "id", //value字段名
        text: "text", //text字段名
        url: "",  //数据接口地址
        params: [],  //数据接口参数
        data: null,
        changed: null  //初始选中项
    };
    var options = $.extend(defaults, options);
    var $element = $(this);
    if (options.data) {
        BindList(options.data, options);
    } else if (options.url) {
        GetAjax(options.url, options.params, function (res) {
            var data = res.Data;
            BindList(data, options);
        });
    }
    /**
     * 绑定选项列表
     */
    function BindList(data, options) {
        var itemsHtml = '';
        $.each(data, function (i) {
            itemsHtml += '<option value="{0}">{1}</option>'.format(data[i][options.id], data[i][options.text]);
        });
        $element.html(itemsHtml);
        //设置默认选中项
        if (options.changed) {
            $element.SetSelectVal(options.changed)
        }

        $element.selectpicker('refresh');
    }
}

/**
 * 获取radio的选中值
 */
$.fn.GetRadioVal = function () {
    return $(this).filter(":checked").val();
}

/**
 * 获取Select的选中值
 */
$.fn.GetSelectVal = function () {
    return $(this).val();
}

/**
 * 获取checkbox选中项ID集合
 */
$.fn.GetCheckboxVal = function () {
    var ids = [];
    $.each($(this).filter(":checked"), function (index, item) {
        ids.push($(item).val())
    })
    return ids;
}

/**
 * 设置radio的选中值
 */
$.fn.SetRadioVal = function (value) {
    $(this).removeAttr("checked");
    $(this).filter('[value="' + value + '"]').prop("checked", "checked");
}

/**
 * 设置Select的选中项（支持单选和多选）
 * @param value 
 * 调用示例：
 * 单选 $("#selectSingle").SetSelectVal('val1')
 * 多选 $("#selectMulti").SetSelectVal(['val1', 'val2']);
 */
$.fn.SetSelectVal = function (value) {
    $(this).selectpicker("val", value).trigger("change");
}

/**
 * 设置checkbox选中项
 * @param values 选中项集合
 * 调用示例  $('input[name="checkbox1"]').SetCheckboxVal(["success", "info", 'danger', 'warning']);
 */
$.fn.SetCheckboxVal = function (values) {
    var $this = $(this);
    //清空
    $.each($(this), function (index, item) {
        $this.prop("checked", false);
    })
    //重新选择
    $.each(values, function (index, item) {
        $this.filter('[value="' + item + '"]').prop("checked", "checked");
    })
}

/**
 * 获取Tree的选中节点
 * @param treeId 树的ID
 * @param isMultiple 是否为多选的树
 * @param needParentNode 是否需要选中的父节点（tree为多选时才需要：由于tree的部分子节点被选中时，父节点会被连带选中，所以一般不需要选中的父节点）
 * 调用示例
 * 单选 GetTreeValue("treeDemo", false, true)   return "a8"
 * 多选 GetTreeValue("treeDemo", true , false)  return "a8,a9,a10"
 */
function GetTreeValue(treeId, isMultiple, needParentNode) {
    if (isMultiple == true) {
        var treeObj = $.fn.zTree.getZTreeObj(treeId);
        var nodes = treeObj.getCheckedNodes();
        var checkedIds = ''
        for (var i = 0; i < nodes.length; i++) {
            if (!needParentNode && nodes[i].isParent) {
                continue;
            }
            checkedIds += nodes[i].id.toString() + ',';
        }
        return checkedIds
    }
    else {
        var treeObj = $.fn.zTree.getZTreeObj(treeId);
        var nodes = treeObj.getSelectedNodes();
        return nodes[0].id;
    }
}

/**
 * 设置选中项
 * @param treeId 树的ID
 * @param isMultiple 是否为多选的树
 * @param values 选中的值,多选时用,隔开
 * 调用示例
 * 单选 SetTreeValue("treeDemo", false, 'a8')
 * 多选 SetTreeValue("treeDemo", true, 'a8,a9,a10')
 */
function SetTreeValue(treeId, isMultiple, values) {
    if (isMultiple == true) {
        values = "," + values.toLowerCase() + ","
        var treeObj = $.fn.zTree.getZTreeObj(treeId);
        var nodes = treeObj.transformToArray(treeObj.getNodes());
        for (var i = 0, l = nodes.length; i < l; i++) {
            if (values.indexOf("," + nodes[i].id.toString().toLowerCase() + ",") > -1) {
                if (!nodes[i].isParent) {
                    treeObj.checkNode(nodes[i], true, true);
                }
            }
        }
    }
    else {
        var treeObj = $.fn.zTree.getZTreeObj(treeId);
        var node = treeObj.getNodeByParam("id", values.toString(), null);
        treeObj.selectNode(node);
    }
}


/**
 * 重新渲染Table样式
 */
function ReviewTableStyle($obj) {
    //即使没有数据,也强行显示分页
    $(".fixed-table-pagination").show();

    //渲染表格中的CheckBox样式
    $obj.find("input:checkbox").each(function (i) {
        var $check = $(this);
        if ($check.attr("id") && $check.next("label")) {
            return;
        }
        $check.next().remove();
        var name = $check.attr("name");
        var id = name + "-" + i;
        var $label = $('<label for="' + id + '"></label>');
        $check.attr("id", id).parent().addClass("checkbox checkbox-primary").append($label);
    });
}

/**
 * 重新渲染Table样式
 */
function ReviewCheckBox($obj) {
    //即使没有数据,也强行显示分页
    $(".fixed-table-pagination").show();

    //渲染表格中的CheckBox样式
    $obj.find("input:checkbox").each(function (i) {
        var $check = $(this);
        if ($check.attr("id") && $check.next("label")) {
            return;
        }
        $check.next().remove();
        var name = $check.attr("name");
        var id = name + "-" + i;
        var $label = $('<label for="' + id + '"></label>');
        $check.attr("id", id).parent().addClass("checkbox checkbox-primary").append($label);
    });
}


/**
 * 获取树的根节点
 * @param treeID 树的ID
 */
function GetZtreeRootNode(treeID) {
    var treeObj = $.fn.zTree.getZTreeObj(treeID);
    //返回一个根节点
    return treeObj.getNodesByFilter(function (node) { return node.level == 0 }, true);
}

/**
 * 获取树的根节点(多个根节点)
 * @param treeID 树的ID
 */
function GetZtreeRootNodes(treeID) {
    var treeObj = $.fn.zTree.getZTreeObj(treeID);
    //返回根节点集合
    return treeObj.getNodesByFilter(function (node) { return node.level == 0 });
}
//=====================================表单插件方法—End================================

/**
 * 字符串格式化
 * 调用示例：StringFormat("&Type={0}&Ro={1}&lPlan={2}&Plan={3}&={4}&Id={5}&Id={6}", data1, data2, data3, data4, data5, data6, data7);
 */
function StringFormat() {
    if (arguments.length == 0)
        return null;
    var str = arguments[0];
    for (var i = 1; i < arguments.length; i++) {
        var re = new RegExp('\\{' + (i - 1) + '\\}', 'gm');
        str = str.replace(re, arguments[i]);
    }
    return str;
}

/**
 * 获取Url中的参数
 * @desc  获取Url中的参数
 * @param name  url参数名
 * @return string
 * @version 1.0
 * @example GetQueryString('id')  如果为中文 escape(id) 参数先加密 否则会出现乱码
 * @author lcw
*/
function GetQueryString(name) {
    var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
    var r = window.location.search.substr(1).match(reg);
    if (r != null) {
        return unescape(r[2]);
    }
    return null;
}
//判断url连接中是否有参数
function IsUrlParame(url) {
    var params = url.split('?');
    if (params != null && params.length > 1) {
        return true
    }
    return false;
}
//+++++++++++++++++++++++++++++++++++++++++自定义系统函数—Start+++++++++++++++++++++++++++++++++++++++++
/**
 * 字符串Trim
 */
String.prototype.trim = function () {
    return this.replace(/(^\s*)|(\s*$)/g, "");
}

/**
 * json排序
 */
function getSortFun(order, sortBy) {
    var ordAlpah = (order == 'asc') ? '>' : '<';
    var sortFun = new Function('a', 'b', 'return a.' + sortBy + ordAlpah + 'b.' + sortBy + '?1:-1');
    return sortFun;
}

/**
 * 清空数组
 */
Array.prototype.clear = function () {
    this.length = 0;
}

/**
 * 插入数组项
 */
Array.prototype.insertAt = function (index, obj) {
    this.splice(index, 0, obj);
}


/**
 * 移除数组项
 */
Array.prototype.remove = function (index) {
    this.splice(index, 1);
}

/**
 * 移除数组项
 */
String.prototype.replaceAll = function (s1, s2) {
    return this.replace(new RegExp(s1, "gm"), s2);
}

/**
 * String.format
 */
String.prototype.format = function (args) {
    var result = this;
    if (arguments.length > 0) {
        if (arguments.length == 1 && typeof (args) == "object") {
            for (var key in args) {
                if (args[key] != undefined) {
                    var reg = new RegExp("({" + key + "})", "g");
                    result = result.replace(reg, args[key]);
                }
            }
        }
        else {
            for (var i = 0; i < arguments.length; i++) {
                if (arguments[i] != undefined) {
                    var reg = new RegExp("({[" + i + "]})", "g");
                    result = result.replace(reg, arguments[i]);
                }
            }
        }
    }
    return result;
}

Date.prototype.Format = function (fmt) {
    var o = {
        "M+": this.getMonth() + 1, //月份
        "d+": this.getDate(), //日
        "H+": this.getHours(), //小时
        "m+": this.getMinutes(), //分
        "s+": this.getSeconds(), //秒
        "q+": Math.floor((this.getMonth() + 3) / 3), //季度
        "S": this.getMilliseconds() //毫秒
    };
    if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
    for (var k in o)
        if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
    return fmt;
}

//+++++++++++++++++++++++++++++++++++++++++自定义系统函数—End+++++++++++++++++++++++++++++++++++++++++


/**
 * SetToken
 * @param key token的名称
 * @param vale token的值
 * @param expire 超时时间，单位：毫秒
 */
function SetLocalStorage(key, value, expire) {
    var obj = {
        data: value,
        time: Date.now(),
        expire: expire
    };
    localStorage.setItem(key, JSON.stringify(obj));
}

/**
 * 获取本地缓存
 * @param key 本地缓存的名称
 */
function GetLocalStorage(key) {
    var val = localStorage.getItem(key);
    if (!val) {
        return val;
    }
    val = JSON.parse(val);
    if (Date.now() - val.time > val.expire) {
        localStorage.removeItem(key);
        return null;
    }
    return val.data;
}


///**
// * 获取当前用户的token
// */
//function GetToken() {
//    var user_token = GetLocalStorage(constVar.usertoken);
//    var loginTime = GetLocalStorage(constVar.logintime);
//    if (user_token == null) {
//        //客户端Token失效，需要重新登录
//        top.window.location = "/login.html";
//        return false;
//    }
//    else {

//        if (loginTime == null) {
//            AjaxForOpenAPI(WebConfig.ApiUrl + WebConfig.ApiVerson.v1 + "/refresh", "get", { token: user_token }, function (res) {
//                user_token = res.Data.access_token;
//                SetLocalStorage(constVar.usertoken, res.Data.access_token, res.Data.refresh_in);
//                SetLocalStorage(constVar.logintime, Date.now(), res.Data.expires_in * 0.9);
//            }, function (err) {
//                top.layer.alert('对不起，您请求的服务不存在。', {
//                    icon: 5,
//                    yes: function () {
//                        window.location.href = "/login.html";
//                    },
//                    cancel: function () {
//                        window.location.href = "/login.html";
//                    }
//                });
//            }, false);
//            return user_token
//        }
//        else {

//            return user_token;
//        }
//    }
//}

/**
 * 获取当前用户的token
 */
async function GetToken() {
    if (ZySoftConfig.IdentityServer) {
        var token = await getToken_ids4();
        //debugger;
        return token;
    }
    else {
        var user_token = GetLocalStorage(constVar.usertoken);
        var loginTime = GetLocalStorage(constVar.logintime);
        if (user_token == null) {
            //客户端Token失效，需要重新登录
            top.window.location = "/login.html";
            return false;
        }
        else {
            if (loginTime == null) {
                AjaxForOpenAPI(ZySoftConfig.ApiUrl + ZySoftConfig.ApiVerson.v1 + "/refresh", "get", { token: user_token }, function (res) {
                    if (res.Code == 200) {
                        user_token = res.Data.access_token;
                        SetLocalStorage(constVar.usertoken, res.Data.access_token, res.Data.refresh_in);
                        SetLocalStorage(constVar.logintime, Date.now(), res.Data.expires_in * 0.9);
                    }
                    else {
                        //客户端Token失效，需要重新登录
                        top.window.location = "/login.html";
                        return false;
                    }
                }, function (err) {
                    top.layer.alert('对不起，您请求的服务不存在。', {
                        icon: 5,
                        yes: function () {
                            window.location.href = "/login.html";
                        },
                        cancel: function () {
                            window.location.href = "/login.html";
                        }
                    });
                }, false);
                return user_token;
            }
            else {
                return user_token;
            }
        }
    }
}

/**
 * 设置cookies
 * @param {cookie的名} name
 * @param {值} value
 * 默认保存30天
 */
function setCookie(name, value) {
    var Days = 30; //此 cookie 将被保存 30 天
    var exp = new Date();    //new Date("December 31, 9998");
    exp.setTime(exp.getTime() + Days * 24 * 60 * 60 * 1000);
    document.cookie = name + "=" + escape(value) + ";path=/;expires=" + exp.toGMTString();
}

/**
 * 读取cookies函数
 * @param {cookie的名} name
 */
function getCookie(name) {
    var arr = document.cookie.match(new RegExp("(^| )" + name + "=([^;]*)(;|$)"));
    if (arr != null) return unescape(arr[2]); return null;
}



/**
 * 上传excel文件
 * @param uploadName 控件名称
 * @param url 请求地址 
 */
function UploadExeclFile(uploadName, url) {
    var control = $("#" + uploadName);
    control.fileinput({
        language: 'zh', //设置语言
        uploadUrl: url, //上传的地址
        allowedFileExtensions: ["xls", "xlsx"], //接收的文件后缀
        //showUpload: true, //显示批量上传按钮
        showCaption: false,//是否显示标题
        browseClass: "btn btn-primary", //按钮样式
        dropZoneEnabled: true,//是否显示拖拽区域
        maxFileSize: 0,//单位为kb，如果为0表示不限制文件大小 
        maxFileCount: 3,
        enctype: 'multipart/form-data',
        validateInitialCount: true,
        previewFileIcon: "<i class='glyphicon glyphicon-king'></i>",

        msgFilesTooMany: "选择上传的文件数量({n}) 超过允许的最大数值{m}！",
    });

}

/**
 * 上传图片
 * @param uploadName 控件名称
 * @param url 请求地址
 * @param uploadExtraData 附带参数，参数格式：{"a":"1","b":"2"}
 */
function UploadImg(uploadName, url, uploadExtraData) {
    var control = $("#" + uploadName);
    control.fileinput({
        language: 'zh', //设置语言
        uploadUrl: url, //上传的地址
        allowedFileExtensions: ["jpg", "jpeg", "png"], //接收的文件后缀
        //showUpload: true, //显示批量上传按钮
        showCaption: false,//是否显示标题
        browseClass: "btn btn-primary", //按钮样式
        dropZoneEnabled: true,//是否显示拖拽区域
        maxFileSize: 0,//单位为kb，如果为0表示不限制文件大小 
        maxFileCount: 3,
        enctype: 'multipart/form-data',
        validateInitialCount: true,
        previewFileIcon: "<i class='glyphicon glyphicon-king'></i>",
        msgFilesTooMany: "选择上传的图片数量({n}) 超过允许的最大数值{m}！",
        uploadExtraData: function (previewId, index) {   //额外参数的关键点
            if (typeof (uploadExtraData) == "object") {
                return uploadExtraData;
            } else {
                return {};
            }
        }
    });

}


/**
 * 导入
 * @param uploadName 控件名称
 * @param url 请求地址
 * @param uploadExtraData 附带参数，参数格式：{"a":"1","b":"2"}
 */
async function Import(uploadName, url, showPreview, uploadExtraData) {
    if (typeof (showPreview) == "undefined") {
        showPreview = true;
    }
    var control = $("#" + uploadName);
    var authorization = await GetToken(constVar.usertoken);
    var Authorization = "Bearer " + authorization;
    control.fileinput({
        ajaxSettings: {
            headers: { Authorization: Authorization }
        },
        language: 'zh', //设置语言
        uploadUrl: url, //上传的地址
        allowedFileExtensions: ["xls", "xlsx"], //接收的文件后缀
        //showUpload: true, //显示批量上传按钮
        showCaption: false,//是否显示标题
        browseClass: "btn btn-primary", //按钮样式
        dropZoneEnabled: true,//是否显示拖拽区域
        maxFileSize: 0,//单位为kb，如果为0表示不限制文件大小
        //minImageWidth: 50, //图片的最小宽度
        //minImageHeight: 50,//图片的最小高度
        //maxImageWidth: 1000,//图片的最大宽度
        //maxImageHeight: 1000,//图片的最大高度
        //maxFileSize: 0,//单位为kb，如果为0表示不限制文件大小
        //minFileCount: 0,
        //uploadAsync: true,              //异步上传
        //language: "zh",                 //设置语言
        //showCaption: true,              //是否显示标题
        //showUpload: true,               //是否显示上传按钮
        //showRemove: true,               //是否显示移除按钮
        showPreview: showPreview,             //是否显示预览按钮
        //browseClass: "btn btn-primary", //按钮样式
        //dropZoneEnabled: false,         //是否显示拖拽区域
        //allowedFileExtensions: ["xls", "xlsx"], //接收的文件后缀 
        maxFileCount: 1,
        enctype: 'multipart/form-data',
        validateInitialCount: true,
        previewFileIcon: "<i class='glyphicon glyphicon-king'></i>",

        msgFilesTooMany: "选择上传的文件数量({n}) 超过允许的最大数值{m}！",
        uploadExtraData: function () {
            if (typeof (uploadExtraData) == "object") {
                return uploadExtraData;
            } else {
                return {};
            }
        }
    })
}


/**
 * 导入任意格式的附件，不限制格式类型
 * @param uploadName 控件名称
 * @param url 请求地址 
 * @param uploadExtraData 附带参数，参数格式：{"a":"1","b":"2"}
 */
async function ImportAnyAttachment(uploadName, url, showPreview) {
    if (typeof (showPreview) == "undefined") {
        showPreview = true;
    }
    var control = $("#" + uploadName);
    var authorization = await GetToken(constVar.usertoken);
    var Authorization = "Bearer " + authorization;
    control.fileinput({
        ajaxSettings: {
            headers: { Authorization: Authorization }
        },
        language: 'zh', //设置语言
        uploadUrl: url, //上传的地址
        allowedFileExtensions: null, //接收的文件后缀
        //showUpload: true, //显示批量上传按钮
        showCaption: false,//是否显示标题
        browseClass: "btn btn-primary", //按钮样式
        dropZoneEnabled: true,//是否显示拖拽区域
        maxFileSize: 0,//单位为kb，如果为0表示不限制文件大小
        //minImageWidth: 50, //图片的最小宽度
        //minImageHeight: 50,//图片的最小高度
        //maxImageWidth: 1000,//图片的最大宽度
        //maxImageHeight: 1000,//图片的最大高度
        //maxFileSize: 0,//单位为kb，如果为0表示不限制文件大小
        //minFileCount: 0,
        //uploadAsync: true,              //异步上传
        //language: "zh",                 //设置语言
        //showCaption: true,              //是否显示标题
        //showUpload: true,               //是否显示上传按钮
        //showRemove: true,               //是否显示移除按钮
        showPreview: showPreview,             //是否显示预览按钮
        //browseClass: "btn btn-primary", //按钮样式
        //dropZoneEnabled: false,         //是否显示拖拽区域
        //allowedFileExtensions: ["xls", "xlsx"], //接收的文件后缀 
        maxFileCount: 1,
        enctype: 'multipart/form-data',
        validateInitialCount: true,
        previewFileIcon: "<i class='glyphicon glyphicon-king'></i>",

        msgFilesTooMany: "选择上传的文件数量({n}) 超过允许的最大数值{m}！",
    });

}

/**
 * 导入任意格式的附件，不限制格式类型(多文件上传)
 * @param uploadName 控件名称
 * @param url 请求地址 
 * @param showPreview 是否显示预览
 * @param maxFileCount 单次最多上传文件数量
 * @param allowedFileExtensions 上传文件类型，参数格式：["xls", "xlsx"]
 * @param uploadExtraData 附带参数，参数格式：{"a":"1","b":"2"}
 */
async function ImportMultipleFile(uploadName, url, showPreview, maxFileCount, maxFileSize, allowedFileExtensions, uploadExtraData) {
    if (typeof (showPreview) == "undefined") {
        showPreview = true;
    }
    if (typeof (maxFileCount) == "undefined") {
        maxFileCount = 1;
    }
    if (typeof (maxFileSize) == "undefined") {
        maxFileSize = 0;
    }
    if (typeof (allowedFileExtensions) != "object") {
        allowedFileExtensions = null;
    }
    var control = $("#" + uploadName);
    var authorization = await GetToken(constVar.usertoken);
    var Authorization = "Bearer " + authorization;
    control.fileinput({
        ajaxSettings: {
            headers: { Authorization: Authorization }
        },
        language: 'zh', //设置语言
        uploadUrl: url, //上传的地址
        allowedFileExtensions: allowedFileExtensions, //接收的文件后缀
        //showUpload: true, //显示批量上传按钮
        showCaption: false,//是否显示标题
        browseClass: "btn btn-primary", //按钮样式
        dropZoneEnabled: true,//是否显示拖拽区域
        maxFileSize: 0,//单位为kb，如果为0表示不限制文件大小
        //minImageWidth: 50, //图片的最小宽度
        //minImageHeight: 50,//图片的最小高度
        //maxImageWidth: 1000,//图片的最大宽度
        //maxImageHeight: 1000,//图片的最大高度
        //maxFileSize: 0,//单位为kb，如果为0表示不限制文件大小
        //minFileCount: 0,
        //uploadAsync: true,              //异步上传
        //language: "zh",                 //设置语言
        //showCaption: true,              //是否显示标题
        //showUpload: true,               //是否显示上传按钮
        //showRemove: true,               //是否显示移除按钮
        showPreview: showPreview,             //是否显示预览按钮
        //browseClass: "btn btn-primary", //按钮样式
        //dropZoneEnabled: false,         //是否显示拖拽区域
        //allowedFileExtensions: ["xls", "xlsx"], //接收的文件后缀 
        maxFileSize: 0,//单位为kb，如果为0表示不限制文件大小 
        maxFileCount: maxFileCount,
        enctype: 'multipart/form-data',
        validateInitialCount: true,
        previewFileIcon: "<i class='glyphicon glyphicon-king'></i>",

        msgFilesTooMany: "选择上传的文件数量({n}) 超过允许的最大数值{m}！",
        uploadExtraData: function () {
            if (typeof (uploadExtraData) == "object") {
                return uploadExtraData;
            } else {
                return {};
            }
        }
    });

}

/**
 * 发送Get文件请求
 * @param url 请求地址
 * @param data 请求参数
 * @param successfn 请求成功的回调函数
 */
async function GetFileAjax(url, data, successfn, errorfn, isasync) {

    var authorization = await GetToken(constVar.usertoken);
    if (!authorization) {
        return;
    }
    if (isasync == undefined) { isasync = true; }
    data = (data == null || data == "" || typeof (data) == "undefined") ? { "date": new Date().getTime() } : data;
    $.get({
        headers: {
            "Content-Type": "application/json;charset=utf-8",
            "Authorization": "Bearer " + authorization
        },
        url: url,
        data: data,
        contentType: "application/json",
        xhrFields: { responseType: "blob" },
        success: function (d) {
            if (typeof (successfn) == "function") {
                successfn(d);
            }
        },
        error: function (err) {
            RequestErrorCallback(err, errorfn);
        }
    });

}

/**
 * 发送Get请求
 * @param url 请求地址
 * @param data 请求参数
 * @param successfn 请求成功的回调函数
 */
async function GetAjax(url, data, successfn, errorfn, isasync) {
    /*var authorization = GetToken(constVar.usertoken);
    if (!authorization) {
        return;
    }*/
    if (isasync == undefined) { isasync = true; }
    data = (data == null || data == "" || typeof (data) == "undefined") ? { "date": new Date().getTime() } : data;

    var token = await GetToken();

    $.get({
        headers: {
            "Content-Type": "application/json;charset=utf-8"
        },
        url: url,
        data: data,
        async: isasync,
        dataType: "json",
        contentType: "application/json",
        beforeSend: function (xhr) {
            xhr.setRequestHeader("Authorization", "Bearer " + token);
        },
        success: function (d) {
            if (typeof (successfn) == "function") {
                successfn(d);
            }
        },
        error: function (err) {
            RequestErrorCallback(err, errorfn);
        }
    });

}
function GetAjaxNoToken(url, data, successfn, errorfn, isasync) {
    /*var authorization = GetToken(constVar.usertoken);
     if (!authorization) {
         return;
     }*/
    if (isasync == undefined) { isasync = true; }
    data = (data == null || data == "" || typeof (data) == "undefined") ? { "date": new Date().getTime() } : data;

    //var token = await GetToken();

    $.get({
        headers: {
            "Content-Type": "application/json;charset=utf-8"
        },
        url: url,
        data: data,
        async: isasync,
        dataType: "json",
        contentType: "application/json",
        beforeSend: function (xhr) {
            //xhr.setRequestHeader("Authorization", "Bearer " + token);
        },
        success: function (d) {
            if (typeof (successfn) == "function") {
                successfn(d);
            }
        },
        error: function (err) {
            RequestErrorCallback(err, errorfn);
        }
    });
};
/**
 * 发送Post请求
 * @param url 发送请求的地址
 * @param data 发送到服务器的数据，数组存储，如：{"date": new Date().getTime(), "state": 1}
 * @param successfn 请求成功回调函数
 * @param errorfn 请求失败回调函数
 * @param isasync 是否为异步调用
 */
async function PostAjax(url, data, successfn, errorfn, isasync) {
    //var authorization = GetToken(constVar.usertoken);
    ///*console.log("post：", authorization)*/
    //if (!authorization) {
    //    return;
    //}

    data = (data == null || data == "" || typeof (data) == "undefined") ? { "date": new Date().getTime() } : data;
    if (isasync == undefined) {
        isasync = true;
    }

    var token = await GetToken();

    $.ajax({
        headers: {
            "Content-Type": "application/json;charset=utf-8"
        },
        url: url,
        async: isasync,
        type: "post",
        data: JSON.stringify(data),
        dataType: "json",
        contentType: "application/json",
        beforeSend: function (xhr) {
            xhr.setRequestHeader("Authorization", "Bearer " + token);
        },
        success: function (d) {
            if (typeof (successfn) == "function") {
                successfn(d);
            }
        },
        error: function (err) {
            RequestErrorCallback(err, errorfn);
        }
    });
};
function PostAjaxNoToken(url, data, successfn, errorfn, isasync) {
    //var authorization = GetToken(constVar.usertoken);
    ///*console.log("post：", authorization)*/
    //if (!authorization) {
    //    return;
    //}

    data = (data == null || data == "" || typeof (data) == "undefined") ? { "date": new Date().getTime() } : data;
    if (isasync == undefined) {
        isasync = true;
    }

    //var token = await GetToken();

    $.ajax({
        headers: {
            "Content-Type": "application/json;charset=utf-8"
        },
        url: url,
        async: isasync,
        type: "post",
        data: JSON.stringify(data),
        dataType: "json",
        contentType: "application/json",
        beforeSend: function (xhr) {
            //xhr.setRequestHeader("Authorization", "Bearer " + token);
        },
        success: function (d) {
            if (typeof (successfn) == "function") {
                successfn(d);
            }
        },
        error: function (err) {
            RequestErrorCallback(err, errorfn);
        }
    });
};
/**
 * 发送Post请求（开放API,不需要进行鉴权处理）
 * @param url 发送请求的地址
 * @param data 发送到服务器的数据，数组存储，如：{"date": new Date().getTime(), "state": 1}
 * @param successfn 成功回调函数
 * @param errorfn 失败回调函数
 * @param isasync 是否为异步调用
 */
function AjaxForOpenAPIWithForm(url, type, data, successfn, errorfn, isasync) {
    $.ajax({
        url: url,
        async: isasync,
        type: type,
        data: data,
        contentType: "application/x-www-form-urlencoded",
        dataType: "json",
        success: function (d) {
            if (typeof (successfn) == "function") {
                successfn(d);
            }
        }
        , error: function (err) {
            RequestErrorCallback(err, errorfn);
        }
    });
}

/**
 * 发送Post请求（开放API,不需要进行鉴权处理）
 * @param url 发送请求的地址
 * @param data 发送到服务器的数据，数组存储，如：{"date": new Date().getTime(), "state": 1}
 * @param successfn 成功回调函数
 * @param errorfn 失败回调函数
 * @param isasync 是否为异步调用
 */
function AjaxForOpenAPI(url, type, data, successfn, errorfn, isasync) {
    $.ajax({
        url: url,
        async: isasync,
        type: type,
        data: data,
        dataType: "json",
        contentType: "application/json",
        success: function (d) {
            if (typeof (successfn) == "function") {
                successfn(d);
            }
        }
        , error: function (err) {
            RequestErrorCallback(err, errorfn);
        }
    });
}

/**
 * 请求错误回调函数
 * @param err 错误信息
 * @param errorfn 要执行的回调函数
 */
function RequestErrorCallback(err, errorfn) {
    if (typeof (errorfn) == "function") {
        errorfn(err);
    } else {
        var msg = "请求失败！";
        if (err.status == 0) {
            top.layer.alert('对不起，您请求的服务不存在。', { icon: 5 });
            return;
        }
        if (err.responseJSON == undefined) {
            if (err.status == 200) {
                msg = "对不起，您没有该功能的访问权限！";
            }
            top.layer.alert(msg, { icon: 5 });
            return;
        }
        var code = err.responseJSON.code;
        switch (code) {
            case 401:
                msg = "登录凭证已失效,请重新登录！";
                break;
            case 403:
                msg = "对不起，您没有该功能的访问权限！";
                break;
        }
        top.layer.alert(msg, { icon: 5 });
    }
}



/**
 * 得到后台响应数据并返回给Table进行渲染
 * @param {any} res
 */
function responseED(res) {
    var resultDT = {};
    if (res.Code == 200) {
        resultDT = {
            rows: res.Data.rows,
            total: res.Data.total
        };
    }
    else {
        resultDT = {
            rows: [],
            total: 0
        };
    }
    return resultDT;
}


/* ============== js excel 操作 ==============   Start    */
/**
 * JSONData为导出的json数据,fileName为导出的文件名,title为导出的第一行标题,filter为过滤字段,rowLength为标题长度
 * @param {any} JSONData
 * @param {any} FileName
 * @param {any} title
 * @param {any} filter
 * @param {any} rowlength
 */
function JSONToExcelConvertor(JSONData, FileName, title, filter, rowlength, noIndex) {
    if (!JSONData) { return }
    if (JSONData.length == 0) {
        top.layer.alert('当前查询数据为空，暂不支持导出！', layerStateIcon.warning)
        return;
    }

    var _index = 0;

    // 转化json为object
    var arrData = typeof JSONData !== 'object' ? JSON.parse(JSONData) : JSONData

    var excel = '<table id="expoetTable">'

    // 设置表头
    var row = '<tr>'
    if (title) {
        // 使用标题项
        $.each(title, function (i, item) {
            row += "<th align='center'>" + item + '</th>' // 将标题新增到row中
        });
    } else {
        // 不使用标题项
        for (var i in arrData[0]) {
            if (!arrData[0].hasOwnProperty(i))
                continue;
            if (noIndex)
                row += "<th align='center'>" + i + ' </th>';
            else
                row += "<th align='center'>" + (++_index) + '.' + i + ' </th>';

        }
    }

    excel += row + '</tr>'
    // 设置数据
    $.each(arrData, function (i, item) {
        var row = '<tr>'
        $.each(item, function (index, value) {
            var isfilter = false;
            // 判断是否有过滤列
            if (filter) {
                // 过滤的列
                $.each(filter, function (i, item) {
                    if (index == item) {
                        isfilter = true;
                    }
                });
            }
            if (!isfilter) {
                var val = value == null ? '-' : value;
                row += "<td align='center'>" + val + '</td>'
            }
        });
        excel += row + '</tr>'
        row = ''
    });

    excel += '</table>'
    var objE = document.createElement('div') // 因为我们这里的数据是string格式的,但是js-xlsx需要dom格式,则先新建一个div然后把数据加入到innerHTML中,在传childNodes[0]即使dom格式的数据
    objE.innerHTML = excel;
    var opt = {
        rowIndex: 4,
        raw: true
    }; //开头空4行
    var sheet = XLSX.utils.table_to_sheet(objE.childNodes[0], opt)// 将一个table对象转换成一个sheet对象,raw为true的作用是把数字当成string,身份证不转换成科学计数法
    openDownloadDialog(sheet2blob(sheet, FileName), FileName + '.xlsx')
}


// 将一个sheet转成最终的excel文件的blob对象，然后利用URL.createObjectURL下载
function sheet2blob(sheet, sheetName) {
    sheetName = sheetName || 'sheet1' // 不存在sheetName时使用sheet1代替
    var workbook = {
        SheetNames: [sheetName],
        Sheets: {}
    }
    workbook.Sheets[sheetName] = sheet // 生成excel的配置项

    var wopts = {
        bookType: 'xlsx', // 要生成的文件类型
        bookSST: false, // 是否生成Shared String Table，官方解释是，如果开启生成速度会下降，但在低版本IOS设备上有更好的兼容性
        type: 'binary' // 二进制格式
    }
    var wbout = XLSX.write(workbook, wopts)
    var blob = new Blob([s2ab(wbout)], {
        type: 'application/octet-stream'
    }) // 字符串转ArrayBuffer
    function s2ab(s) {
        var buf = new ArrayBuffer(s.length)
        var view = new Uint8Array(buf)
        for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF
        return buf
    }
    return blob
}
// 下载的方法
function openDownloadDialog(url, saveName) {
    if (typeof url === 'object' && url instanceof Blob) {
        url = URL.createObjectURL(url) // 创建blob地址
    }
    var aLink = document.createElement('a')
    aLink.href = url
    aLink.download = saveName || '' // HTML5新增的属性，指定保存文件名，可以不要后缀，注意，file:///模式下不会生效
    var event
    if (window.MouseEvent) event = new MouseEvent('click')
    else {
        event = document.createEvent('MouseEvents')
        event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null)
    }
    aLink.dispatchEvent(event)

}
/* ============== js excel 操作 ==============   End    */







/**
 * DES加密
 * @param message 加密消息
 * @param key 加密键 
 */
function encryptByDES(message, key) {
    var keyHex = CryptoJS.enc.Utf8.parse(key);
    var encrypted = CryptoJS.DES.encrypt(message, keyHex, {
        mode: CryptoJS.mode.ECB,
        padding: CryptoJS.pad.Pkcs7
    });
    return encrypted.toString();
}

/**
 * DES加密
 * @param data 对对象进行加密
 */
function dataEncryptDES(data, key) {
    for (var tmp in data) {
        if ((typeof data[tmp] == 'string') && data[tmp].constructor == String) {
            data[tmp] = encryptByDES(data[tmp], key);
        }
    }
}
function dataDecryptDES(data, key) {
    for (var tmp in data) {
        if ((typeof data[tmp] == 'string') && data[tmp].constructor == String) {
            data[tmp] = decryptByDESModeEBC(data[tmp], key);
        }
    }
}
//DES
function decryptByDES(ciphertext, key) {
    var keyHex = CryptoJS.enc.Utf8.parse(key);
    var decrypted = CryptoJS.DES.decrypt({
        ciphertext: CryptoJS.enc.Base64.parse(ciphertext)
    }, keyHex, {
        mode: CryptoJS.mode.ECB,
        padding: CryptoJS.pad.Pkcs7
    });
    var result_value = decrypted.toString(CryptoJS.enc.Utf8);
    return result_value;
}
//加密
//dataEncryptDES(params, WebEncryptKey.Parameter)


//-----------------------------------自定义验证规则----------------------------------------
if ($.validator) {
    //手机号验证
    $.validator.addMethod('mobile', function (value, element) {
        var reg = /(^13\d{9}$)|(^14)[5,7]\d{8}$|(^15[0,1,2,3,5,6,7,8,9]\d{8}$)|(^17)[6,7,8]\d{8}$|(^18\d{9}$)/g;
        return reg.test(value)
    }, '请输入正确的手机号码');
}


/**
* 获取页⾯⽂件名
* @param url ⽂件url
* @param fileName 保存文件名称
*/
function downloadUrlFile(url, fileName) {
    url = url.replace(/\\/g, '/');
    const xhr = new XMLHttpRequest();
    xhr.open('GET', url + '?response-content-type=application/octet-stream', true);
    xhr.responseType = 'blob';
    //xhr.setRequestHeader('Authorization', 'Basic a2VybWl0Omtlcm1pdA==');
    xhr.onload = () => {
        if (xhr.status === 200) {
            // 获取⽂件blob数据并保存
            if (!fileName) {
                fileName = getFileName(url);
            }
            saveAs(xhr.response, fileName);
        }
    };
    xhr.send();
}
/**
 * URL⽅式保存⽂件到本地
 * @param data ⽂件的blob数据
 * @param name ⽂件名
 */
function saveAs(data, name) {
    var urlObject = window.URL || window.webkitURL || window;
    var export_blob = new Blob([data]);
    var save_link = document.createElementNS('http://www.w3.org/1999/xhtml', 'a')
    save_link.href = urlObject.createObjectURL(export_blob);
    save_link.download = name;
    save_link.click();
}
/**
 * 根据⽂件url获取⽂件名
 * @param url ⽂件url
 */
function getFileName(url) {
    var num = url.lastIndexOf('/') + 1
    var fileName = url.substring(num)
    //把参数和⽂件名分割开
    fileName = decodeURI(fileName.split("?")[0]);
    return fileName;
}
/*
* # 判断IP地址是否合法，仅支持IPV4
* 输入IP地址
* 如果合法返回 true , 如果不合法返回 false
**/
function Is_Ipv4(ip) {
    if (ip == "localhost") return true;
    var reg = /^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/
    return reg.test(ip);
}
/*
* # 判断IP地址是否合法，仅支持IPV4
* 输入IP地址
* 如果合法返回 true , 如果不合法返回 false
**/
function Is_Ipv4_Split(ip) {
    ip_arr = ip.split('.');
    if (ip_arr.length != 4) {
        return false;
    }
    for (i = 0; i < ip_arr.length; i++) {
        if (ip_arr[i] < 0 || ip_arr[i] > 255) {
            return false;
        }
    }
    return true;
}